enum枚举类型
//限定作用域的枚举类型(c++11)
enum class open_modes { input, output, append };
//不限定作用域的枚举类型
enum color { red, yellow, green };
//不限定作用域的匿名枚举类型
enum { floatPrec = 6, doublePrec = 10 };
匿名枚举类型用处
- 在程序中需要数值的名字的时候使用
- 宏定义的缺点:在预处理阶段只做简单替换不做安全检查
- 匿名的enum枚举:编译器会对其进行类型检查,若代码中其他地方有和该名字冲突的,会报错
- 静态变量: 作用域在本文件内,编译阶段检查,比匿名enum内存占用多
- 在程序中需要数值的名字的时候使用
和类一样,每个枚举类型定义了一种新的类型。枚举属于字面值常量类型。
- 关键字是 enum class(等价enum struct)
- 限定作用域枚举类型,作用域外无法访问;不限定作用域的枚举类型,枚举成员的作用域和枚举类型本身的作用域一致
enum class /*struct*/ MyEnum { A = 0}; // 限定作用域的枚举
enum class /*struct*/ MyEnum1 { A = 0 }; // 限定作用域的枚举可以有重复的名字,使用时也必须加上作用域
enum MyEnum2 { B = 0 }; // 不限定作用域的枚举
enum MyEnum3 { B = 0 }; // 不限定作用域的枚举不能有重复的名字
enum {test = 0} t,t1; // 未命名的不限定作用域的枚举,只能在定义是就定义对象
MyEnum::A; //限定作用域的枚举要带上作用域
B; //true
默认情况下,枚举值从0开始,依次加1,如果没有显示提供值,就在前一个枚举值的基础上加1。枚举成员是const的。
只要enum有名字,我们就能定义并初始化该类型的成员。想要初始化enum对象或者为enum对象赋值,必须使用该类型的一个枚举成员或者该类型的另一个对象。
一个不限定作用域的枚举类型的对象或枚举成员自动的转成整型
在C++11新标准中,我们可以在enum的名字后加上冒号以及我们想在该enum中使用的类型。对于不限定作用域的枚举类型来说,其枚举成员不存在默认类型,我们只知道成员的潜在类型足够大,肯定能容纳枚举值。如果我们指定了潜在类型,则一旦超出范围将引发错误。对于限定作用域的枚举成员,其缺省为int类型
在C++11 新标准中,我们可以提前声明enum。enum的前置声明必须指定其成员的大小。
enum test : long; // 不限定作用域的,必须指定成员类型 enum class test1; // 限定作用域的枚举类型可以使用默认成员类型int
int值不可以做以enmu为形参的函数的实参。对与不限定作用域的enum做形参时,enum的值提升成int或更大的整型(注意只会提升成对应整型,不会隐式转换为unsigned char之类),实际提升的结果由枚举类型的潜在类型决定。